WebAssemblyã®äŸå€åŠçãæ·±ãæãäžããããã©ãŒãã³ã¹ãžã®åœ±é¿ãšãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ãããå¹ççãªãšã©ãŒåŠçã®ããã®æé©åæè¡ãæ¢ããŸãã
WebAssemblyäŸå€åŠçã®æé©åïŒãšã©ãŒåŠçæ§èœãæå€§åãã
WebAssembly (WASM)ã¯ã髿§èœãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªæè¡ãšããŠç»å ŽããŸããããã®ãã€ãã£ãã«è¿ãå®è¡é床ãšã¯ãã¹ãã©ãããã©ãŒã äºææ§ã«ãããèšç®éçŽçãªã¿ã¹ã¯ã«çæ³çãªéžæè¢ãšãªã£ãŠããŸããããããä»ã®ããã°ã©ãã³ã°èšèªãšåæ§ã«ãWASMã«ããšã©ãŒãäŸå€ãå¹ççã«åŠçããããã®ã¡ã«ããºã ãå¿ èŠã§ãããã®èšäºã§ã¯ãWebAssemblyã®äŸå€åŠçã®è€éããæ¢ãããšã©ãŒåŠçæ§èœãæå€§åããããã®æé©åæè¡ãæãäžããŸãã
WebAssemblyã®äŸå€åŠçãçè§£ãã
äŸå€åŠçã¯ãå ç¢ãªãœãããŠã§ã¢éçºã®éèŠãªåŽé¢ã§ããããã«ãããããã°ã©ã ã¯ã¯ã©ãã·ã¥ããããšãªããäºæãã¬ãšã©ãŒãäŸå€çãªç¶æ³ããé©åã«å埩ã§ããŸããWebAssemblyã§ã¯ãäŸå€åŠçã¯ãšã©ãŒãéç¥ãåŠçããããã®æšæºåãããæ¹æ³ãæäŸããäžè²«æ§ã®ããäºæž¬å¯èœãªå®è¡ç°å¢ãä¿èšŒããŸãã
WebAssemblyäŸå€ã®ä»çµã¿
WebAssemblyã®äŸå€åŠçã¡ã«ããºã ã¯ã以äžã®äž»èŠãªæŠå¿µãå«ãæ§é åãããã¢ãããŒãã«åºã¥ããŠããŸãã
- äŸå€ã®ã¹ããŒïŒãšã©ãŒãçºçãããšãã³ãŒãã¯äŸå€ãã¹ããŒããŸããããã¯ãäœããããŸããããªãã£ãããšã瀺ãã·ã°ãã«ã§ããããã«ã¯ãäŸå€ã®ã¿ã€ããæå®ãããªãã·ã§ã³ã§ããŒã¿ãé¢é£ä»ããããšãå«ãŸããŸãã
- äŸå€ã®ãã£ããïŒæœåšçãªãšã©ãŒãäºæž¬ããã³ãŒãã¯ãåé¡ã®ããé åã
tryãããã¯ã§å²ãããšãã§ããŸããtryãããã¯ã«ç¶ããŠãç¹å®ã®äŸå€ã¿ã€ããåŠçããããã«1ã€ä»¥äžã®catchãããã¯ãå®çŸ©ãããŸãã - äŸå€ã®äŒæïŒäŸå€ãçŸåšã®é¢æ°å ã§ãã£ãããããªãå ŽåããããåŠçã§ãã颿°ã«å°éãããŸã§ã³ãŒã«ã¹ã¿ãã¯ãäžã«äŒæããŸãããã³ãã©ãèŠã€ãããªãå ŽåãWebAssemblyã©ã³ã¿ã€ã ã¯éåžžãå®è¡ãçµäºããŸãã
WebAssembly仿§ã§ã¯ãäŸå€ãã¹ããŒããã³ãã£ããããããã®äžé£ã®åœä»€ãå®çŸ©ãããŠãããéçºè ã¯é«åºŠãªãšã©ãŒåŠçæŠç¥ãå®è£ ã§ããŸããããããäŸå€åŠçã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ãç¹ã«ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ significant ã«ãªãå¯èœæ§ããããŸãã
äŸå€åŠçã®ããã©ãŒãã³ã¹ãžã®åœ±é¿
äŸå€åŠçã¯ãå ç¢æ§ã®ããã«äžå¯æ¬ ã§ãããããã€ãã®èŠå ã«ãããªãŒããŒããããçºçããå¯èœæ§ããããŸãã
- ã¹ã¿ãã¯ã¢ã³ã¯ã€ã³ãïŒäŸå€ãã¹ããŒãããããã«ãã£ãããããªãå ŽåãWebAssemblyã©ã³ã¿ã€ã ã¯é©åãªäŸå€ãã³ãã©ãæ¢ããŠã³ãŒã«ã¹ã¿ãã¯ãã¢ã³ã¯ã€ã³ãããå¿ èŠããããŸãããã®ããã»ã¹ã«ã¯ãã¹ã¿ãã¯äžã®å颿°ã®ç¶æ ã埩å ããããšãå«ãŸããæéããããå ŽåããããŸãã
- äŸå€ãªããžã§ã¯ãã®çæïŒäŸå€ãªããžã§ã¯ãã®äœæãšç®¡çããªãŒããŒãããã䌎ããŸããã©ã³ã¿ã€ã ã¯äŸå€ãªããžã§ã¯ãã®ããã«ã¡ã¢ãªãå²ãåœãŠãé¢é£ãããšã©ãŒæ å ±ãèšå®ããå¿ èŠããããŸãã
- å¶åŸ¡ãããŒã®äžæïŒäŸå€åŠçã¯éåžžã®å®è¡ãããŒãäžæããããã£ãã·ã¥ãã¹ãåå²äºæž¬ã®å€±æã«ã€ãªããå¯èœæ§ããããŸãã
ãããã£ãŠãäŸå€åŠçã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãæ éã«æ€èšãããã®åœ±é¿ã軜æžããããã®æé©åæè¡ãæ¡çšããããšãéèŠã§ãã
WebAssemblyäŸå€åŠçã®æé©åæè¡
WebAssemblyäŸå€åŠçã®ããã©ãŒãã³ã¹ãåäžãããããã«ãããã€ãã®æé©åæè¡ãé©çšã§ããŸãããããã®æè¡ã¯ãã³ã³ãã€ã©ã¬ãã«ã®æé©åãããäŸå€ã®çºçé »åºŠãæå°éã«æããã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ãŸã§å€å²ã«ããããŸãã
1. ã³ã³ãã€ã©ã«ããæé©å
ã³ã³ãã€ã©ã¯ãäŸå€åŠçã®æé©åã«ãããŠéèŠãªåœ¹å²ãæãããŸããããã€ãã®ã³ã³ãã€ã©æé©åã«ãããäŸå€ã®ã¹ããŒãšãã£ããã«é¢é£ãããªãŒããŒããããåæžã§ããŸãã
- ãŒãã³ã¹ãäŸå€åŠç (ZCEH)ïŒZCEHã¯ãäŸå€ãã¹ããŒãããªãå Žåã®äŸå€åŠçã®ãªãŒããŒããããæå°éã«æããããšãç®çãšããã³ã³ãã€ã©æé©åæè¡ã§ããåºæ¬çã«ãZCEHã¯äŸå€ãå®éã«çºçãããŸã§äŸå€åŠçããŒã¿æ§é ã®äœæãé å»¶ãããŸããããã«ãããäŸå€ããŸããªäžè¬çãªã±ãŒã¹ã§ã®ãªãŒããŒããããå€§å¹ ã«åæžã§ããŸãã
- ããŒãã«é§åã®äŸå€åŠçïŒãã®æè¡ã¯ãã«ãã¯ã¢ããããŒãã«ã䜿çšããŠãç¹å®ã®äŸå€ã¿ã€ããšããã°ã©ã ã®å Žæã«é©ããäŸå€ãã³ãã©ãè¿ éã«ç¹å®ããŸããããã«ãããã³ãŒã«ã¹ã¿ãã¯ãã¢ã³ã¯ã€ã³ãããŠãã³ãã©ãèŠã€ããã®ã«å¿ èŠãªæéãççž®ã§ããŸãã
- äŸå€åŠçã³ãŒãã®ã€ã³ã©ã€ã³åïŒå°ããªäŸå€ãã³ãã©ãã€ã³ã©ã€ã³åããããšã§ã颿°åŒã³åºãã®ãªãŒããŒãããããªãããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
BinaryenãLLVMã®ãããªããŒã«ã¯ãWebAssemblyäŸå€åŠçã®ããã©ãŒãã³ã¹ãåäžãããããã«äœ¿çšã§ããããŸããŸãªæé©åãã¹ãæäŸããŸããäŸãã°ãBinaryenã®--optimize-level=3ãªãã·ã§ã³ã¯ãäŸå€åŠçã«é¢é£ãããã®ãå«ãç©æ¥µçãªæé©åãæå¹ã«ããŸãã
Binaryenã䜿çšããäŸïŒ
binaryen input.wasm -o optimized.wasm --optimize-level=3
2. ã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹
ã³ã³ãã€ã©ã«ããæé©åã«å ããŠãã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ãäŸå€åŠçã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãã以äžã®ã¬ã€ãã©ã€ã³ãèæ ®ããŠãã ããã
- äŸå€ã®ã¹ããŒãæå°éã«æããïŒäŸå€ã¯ãå埩äžå¯èœãªãšã©ãŒãªã©ãçã«äŸå€çãªç¶æ³ã®ããã«äºçŽãããã¹ãã§ããéåžžã®å¶åŸ¡ãããŒã®ä»£ãããšããŠäŸå€ã䜿çšããªãã§ãã ãããäŸãã°ããã¡ã€ã«ãèŠã€ãããªãå Žåã«äŸå€ãã¹ããŒãã代ããã«ããã¡ã€ã«ãéãããšããåã«ãã®ååšã確èªããŸãã
- ãšã©ãŒã³ãŒããŸãã¯ãªãã·ã§ãã«åã䜿çšããïŒãšã©ãŒãäºæž¬ãããæ¯èŒçäžè¬çãªç¶æ³ã§ã¯ãäŸå€ã®ä»£ããã«ãšã©ãŒã³ãŒããŸãã¯ãªãã·ã§ãã«åã䜿çšããããšãæ€èšããŠãã ããããšã©ãŒã³ãŒãã¯æäœã®çµæãç€ºãæŽæ°å€ã§ããããªãã·ã§ãã«åã¯å€ãä¿æããããå€ãååšããªãããšã瀺ãããšãã§ããããŒã¿æ§é ã§ãããããã®ã¢ãããŒãã¯ãäŸå€åŠçã®ãªãŒããŒããããåé¿ã§ããŸãã
- äŸå€ã屿çã«åŠçããïŒäŸå€ãçºçæºã«ã§ããã ãè¿ãå Žæã§ãã£ããããŸããããã«ãããå¿ èŠãªã¹ã¿ãã¯ã¢ã³ã¯ã€ã³ãã®éãæå°éã«æããããããã©ãŒãã³ã¹ãåäžããŸãã
- ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ã§äŸå€ãã¹ããŒããªãïŒã³ãŒãã®ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ãç¹å®ãããããã®é åã§äŸå€ãã¹ããŒããªãããã«ããŸããäŸå€ãé¿ããããªãå Žåã¯ããªãŒããŒããããå°ãªã代æ¿ã®ãšã©ãŒåŠçã¡ã«ããºã ãæ€èšããŠãã ããã
- ç¹å®ã®äŸå€ã¿ã€ãã䜿çšããïŒç°ãªããšã©ãŒæ¡ä»¶ã«å¯ŸããŠç¹å®ã®äŸå€ã¿ã€ããå®çŸ©ããŸããããã«ãããäŸå€ãããæ£ç¢ºã«ãã£ããããŠåŠçã§ããäžèŠãªãªãŒããŒããããåé¿ã§ããŸãã
äŸïŒC++ã§ãšã©ãŒã³ãŒãã䜿çšãã
代ããã«ïŒ
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero");
}
return a / b;
}
int main() {
try {
int result = divide(10, 0);
std::cout << "Result: " << result << std::endl;
} catch (const std::runtime_error& err) {
std::cerr << "Error: " << err.what() << std::endl;
}
return 0;
}
以äžã䜿çšïŒ
#include <iostream>
#include <optional>
std::optional<int> divide(int a, int b) {
if (b == 0) {
return std::nullopt;
}
return a / b;
}
int main() {
auto result = divide(10, 0);
if (result) {
std::cout << "Result: " << *result << std::endl;
} else {
std::cerr << "Error: Division by zero" << std::endl;
}
return 0;
}
ãã®äŸã¯ãC++ã§ std::optional ã䜿çšããŠããŒãé€ç®ã®äŸå€ãã¹ããŒããã®ãåé¿ããæ¹æ³ã瀺ããŠããŸããdivide 颿°ã¯ std::optional<int> ãè¿ãããã«ãªããé€ç®ã®çµæãä¿æãããããšã©ãŒãçºçããããšã瀺ãããšãã§ããŸãã
3. èšèªåºæã®èæ ®äºé
WebAssemblyã³ãŒããçæããããã«äœ¿çšãããç¹å®ã®èšèªããäŸå€åŠçã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããäŸãã°ãäžéšã®èšèªã¯ä»ã®èšèªãããå¹ççãªäŸå€åŠçã¡ã«ããºã ãæã£ãŠããŸãã
- C/C++ïŒC/C++ã§ã¯ãäŸå€åŠçã¯éåžžãItanium C++ ABI äŸå€åŠçã¢ãã«ã䜿çšããŠå®è£ ãããŸãããã®ã¢ãã«ã«ã¯ãæ¯èŒçé«äŸ¡ã«ãªãå¯èœæ§ã®ããäŸå€åŠçããŒãã«ã®äœ¿çšãå«ãŸããŸããããããZCEHã®ãããªã³ã³ãã€ã©æé©åã«ããããªãŒããŒããããå€§å¹ ã«åæžã§ããŸãã
- RustïŒRustã®
Resultåã¯ãäŸå€ã«é Œããã«ãšã©ãŒãåŠçããããã®å ç¢ã§å¹ççãªæ¹æ³ãæäŸããŸããResultåã¯æåå€ãŸãã¯ãšã©ãŒå€ã®ãããããä¿æã§ããéçºè ã¯ã³ãŒãå ã§æç€ºçã«ãšã©ãŒãåŠçã§ããŸãã - JavaScriptïŒJavaScriptèªäœã¯ãšã©ãŒåŠçã«äŸå€ã䜿çšããŸãããWebAssemblyãã¿ãŒã²ããã«ããå Žåãéçºè ã¯JavaScriptäŸå€ã®ãªãŒããŒããããåé¿ããããã«ä»£æ¿ã®ãšã©ãŒåŠçã¡ã«ããºã ãéžæã§ããŸãã
4. ãããã¡ã€ãªã³ã°ãšãã³ãããŒã¯
ãããã¡ã€ãªã³ã°ãšãã³ãããŒã¯ã¯ãäŸå€åŠçã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«äžå¯æ¬ ã§ãããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãäŸå€ã®ã¹ããŒãšãã£ããã«è²»ããããæéãæž¬å®ããã³ãŒãã®äžã§äŸå€åŠçãç¹ã«é«äŸ¡ãªé åãç¹å®ããŸãã
ããŸããŸãªäŸå€åŠçæŠç¥ããã³ãããŒã¯ããããšã§ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«æãå¹ççãªã¢ãããŒããæ±ºå®ã§ããŸããåã ã®äŸå€åŠçæäœã®ããã©ãŒãã³ã¹ãåé¢ããããã«ãã€ã¯ããã³ãããŒã¯ãäœæããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«å¯ŸããäŸå€åŠçã®å šäœçãªåœ±é¿ãè©äŸ¡ããããã«å®äžçã®ãã³ãããŒã¯ã䜿çšããŸãã
å®äžçã§ã®äŸ
ãããã®æé©åæè¡ãå®éã«ã©ã®ããã«é©çšã§ãããã瀺ãããã«ãããã€ãã®å®äžçã§ã®äŸãèããŠã¿ãŸãããã
1. ç»ååŠçã©ã€ãã©ãª
WebAssemblyã§å®è£ ãããç»ååŠçã©ã€ãã©ãªã¯ãç¡å¹ãªç»åãã©ãŒããããã¡ã¢ãªäžè¶³ãªã©ã®ãšã©ãŒãåŠçããããã«äŸå€ã䜿çšãããããããŸãããäŸå€åŠçãæé©åããããã«ãã©ã€ãã©ãªã¯æ¬¡ã®ããšãã§ããŸãã
- ç¡å¹ãªãã¯ã»ã«å€ãªã©ã®äžè¬çãªãšã©ãŒã«ã¯ããšã©ãŒã³ãŒããŸãã¯ãªãã·ã§ãã«åã䜿çšããã
- ã¹ã¿ãã¯ã¢ã³ã¯ã€ã³ããæå°éã«æããããã«ãç»ååŠç颿°å ã§å±æçã«äŸå€ãåŠçããã
- ãã¯ã»ã«åŠçã«ãŒãã³ã®ãããªããã©ãŒãã³ã¹ãéèŠãªã«ãŒãã§äŸå€ãã¹ããŒããªãã
- ãšã©ãŒãçºçããªãå Žåã®äŸå€åŠçã®ãªãŒããŒããããåæžããããã«ãZCEHã®ãããªã³ã³ãã€ã©æé©åãæŽ»çšããã
2. ã²ãŒã ãšã³ãžã³
WebAssemblyã§å®è£ ãããã²ãŒã ãšã³ãžã³ã¯ãç¡å¹ãªã²ãŒã ã¢ã»ããããªãœãŒã¹ã®èªã¿èŸŒã¿å€±æãªã©ã®ãšã©ãŒãåŠçããããã«äŸå€ã䜿çšãããããããŸãããäŸå€åŠçãæé©åããããã«ããšã³ãžã³ã¯æ¬¡ã®ããšãã§ããŸãã
- WebAssemblyäŸå€ã®ãªãŒããŒããããåé¿ããã«ã¹ã¿ã ãšã©ãŒåŠçã·ã¹ãã ãå®è£ ããã
- éçºäžã«ãšã©ãŒãæ€åºããŠåŠçããããã«ã¢ãµãŒã·ã§ã³ã䜿çšããããããã©ãŒãã³ã¹ãåäžãããããã«è£œåãã«ãã§ã¯ã¢ãµãŒã·ã§ã³ãç¡å¹ã«ããã
- ãšã³ãžã³ã®æãããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ã§ããã²ãŒã ã«ãŒãã§äŸå€ãã¹ããŒããªãã
3. ç§åŠæè¡èšç®ã¢ããªã±ãŒã·ã§ã³
WebAssemblyã§å®è£ ãããç§åŠæè¡èšç®ã¢ããªã±ãŒã·ã§ã³ã¯ãæ°å€çäžå®å®æ§ãåæå€±æãªã©ã®ãšã©ãŒãåŠçããããã«äŸå€ã䜿çšãããããããŸãããäŸå€åŠçãæé©åããããã«ãã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããšãã§ããŸãã
- ãŒãé€ç®ãè² ã®æ°ã®å¹³æ¹æ ¹ãªã©ã®äžè¬çãªãšã©ãŒã«ã¯ããšã©ãŒã³ãŒããŸãã¯ãªãã·ã§ãã«åã䜿çšããã
- ãŠãŒã¶ãŒããšã©ãŒã®åŠçæ¹æ³ïŒäŸïŒå®è¡ãçµäºãããããã©ã«ãå€ã§ç¶è¡ãããèšç®ãå詊è¡ããïŒãæå®ã§ããã«ã¹ã¿ã ãšã©ãŒåŠçã·ã¹ãã ãå®è£ ããã
- ãšã©ãŒãçºçããªãå Žåã®äŸå€åŠçã®ãªãŒããŒããããåæžããããã«ãZCEHã®ãããªã³ã³ãã€ã©æé©åã䜿çšããã
çµè«
WebAssemblyã®äŸå€åŠçã¯ãå ç¢ã§ä¿¡é Œæ§ã®é«ããŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§éèŠãªåŽé¢ã§ããäŸå€åŠçã¯ããã©ãŒãã³ã¹ã®ãªãŒããŒããããããããå¯èœæ§ããããŸãããããŸããŸãªæé©åæè¡ã«ãã£ãŠãã®åœ±é¿ã軜æžã§ããŸããäŸå€åŠçã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãçè§£ããé©åãªæé©åæŠç¥ãæ¡çšããããšã§ãéçºè ã¯ãšã©ãŒãé©åã«åŠçããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãã髿§èœãªWebAssemblyã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
éèŠãªãã€ã³ãïŒ
- äžè¬çãªãšã©ãŒã«ã¯ãšã©ãŒã³ãŒãããªãã·ã§ãã«åã䜿çšããäŸå€ã®ã¹ããŒãæå°éã«æããã
- ã¹ã¿ãã¯ã¢ã³ã¯ã€ã³ããæžããããã«ãäŸå€ã屿çã«åŠçããã
- ã³ãŒãã®ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ã§äŸå€ãã¹ããŒããªãã
- ãšã©ãŒãçºçããªãå Žåã®äŸå€åŠçã®ãªãŒããŒããããåæžããããã«ãZCEHã®ãããªã³ã³ãã€ã©æé©åã䜿çšããã
- äŸå€åŠçã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«ãã³ãŒãããããã¡ã€ãªã³ã°ããã³ãã³ãããŒã¯ããã
ãããã®ã¬ã€ãã©ã€ã³ã«åŸãããšã§ãWebAssemblyã®äŸå€åŠçãæé©åãããŠã§ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæå€§åã§ããŸãã